﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Rendiciones.Logica.Enumeradores;
using Rendiciones.Logica.Modelos;
using Rendiciones.Logica.Servicios;
using Rendiciones.Web.infraestructura;
using Tesla.Excepciones;
using Tesla.Validador;

namespace Rendiciones.Web.Custodio
{
    public partial class ctrlEditarGasto : UserControlBase
    {
        private static ServGastos _servGastos;
        private static Validador _validador;



        protected void Page_Load(object sender, EventArgs e)
        {
            _validador = new Validador();
            _servGastos = new ServGastos();
            DrTipoGasto.DataTextField = "DescripcionGasto";
            DrTipoGasto.DataValueField = "IdGasto";

            DrGastoAsociado.DataTextField = "DescripcionGasto";
            DrGastoAsociado.DataValueField = "IdGasto";

            ddTipoDocumento.DataTextField = "Descripcion";
            ddTipoDocumento.DataValueField = "IdDocumento";
            if (!IsPostBack)
            {
                LimpiarErrores(pnlAgregarGasto);
                CargarCombos();
            }
        }

        public void CargarCombos()
        {
            DrTipoGasto.DataSource = _servGastos.TodosLosTiposDeGasto();
            DrTipoGasto.DataBind();

            int idGasto = int.Parse(DrTipoGasto.SelectedValue);
            DrGastoAsociado.DataSource = _servGastos.TiposDeGastoAsociados(idGasto);
            DrGastoAsociado.DataBind();


            ddTipoDocumento.DataSource = Modulos.Rendiciones.Documentos.Buscar();
            ddTipoDocumento.DataBind();

        }

        public void Mostrar()
        {

            txtFechaDocumento.Text = "";
            txtNroDocumento.Text = "";
            txtRutBeneficiario.Text = "";
            txtNombreProveedor.Text = "";
            txtDescripcion.Text = "";
            txtMontoNeto.Text = "";
            txtIVA.Text = "";
            txtRetencion.Text = "";
            txtTotalPagado.Text = "";
            DrTipoGasto.SelectedIndex = -1;
            DrGastoAsociado.SelectedIndex = -1;
            txtMontoExento.Text = "";
            mpeAgregarGasto.Show();
        }

        public void Cerrar()
        {
            mpeAgregarGasto.Hide();
        }

        protected void BtnGuardarGasto_Click(object sender, EventArgs e)
        {
            LimpiarErrores(pnlAgregarGasto);
            try
            {
                Validar(GastoIngresado);
                //CargaDatosAGrilla(0, true);
                Ingresado = true;
                Cerrar();
            }
            catch (ResultadoValidacionException resultadoValidacionException)
            {
                MuestraErroresDeValidacion(pnlAgregarGasto, true, resultadoValidacionException);
                Ingresado = false;
            }
        }

        public bool Ingresado { get; set; }

        public string NroGasto { get { return lbl_NRO_RENDICION.Text; } set { lbl_NRO_RENDICION.Text = value; } }

        protected void BtnCancelarGasto_Click(object sender, EventArgs e)
        {
            LimpiarErrores(pnlAgregarGasto);
            Cerrar();
        }

        public ETipoDocumentoGenerico TipoDocumentoGenerico
        {
            get
            {
                var tipoDoc = new ETipoDocumentoGenerico();
                if (rbtTipoDocumento.SelectedValue == "1")
                    tipoDoc = ETipoDocumentoGenerico.Boleta;
                if (rbtTipoDocumento.SelectedValue == "2")
                    tipoDoc = ETipoDocumentoGenerico.Factura;
                if (rbtTipoDocumento.SelectedValue == "3")
                    tipoDoc = ETipoDocumentoGenerico.BoletaHonorarios;
                return tipoDoc;
            }
            set
            {
                if (value == ETipoDocumentoGenerico.Boleta)
                    rbtTipoDocumento.SelectedValue = "1";
                if (value == ETipoDocumentoGenerico.Factura)
                    rbtTipoDocumento.SelectedValue = "2";
                if (value == ETipoDocumentoGenerico.BoletaHonorarios)
                    rbtTipoDocumento.SelectedValue = "3";
            }
        }

        public void CargaDatosAPopup(Gasto gasto)
        {
            hfIdGasto.Value = gasto.IdGasto.ToString();
            DrTipoGasto.SelectedValue = gasto.TipoGasto.IdGasto.ToString();
            DrGastoAsociado.DataSource = _servGastos.TiposDeGastoAsociados(int.Parse(DrTipoGasto.SelectedValue));
            DrGastoAsociado.DataBind();
            DrGastoAsociado.SelectedValue = gasto.GastoAsociado.ToString();
            ddTipoDocumento.SelectedValue = gasto.TipoDocumento.IdDocumento.ToString();
            txtRutBeneficiario.Text = gasto.RutBeneficiario;
            txtNombreProveedor.Text = gasto.NombreBeneficiario;
            txtFechaDocumento.Text = gasto.FechaDocumento.HasValue ? gasto.FechaDocumento.Value.ToString("dd-MM-yyyy") : "";
            txtNroDocumento.Text = gasto.NroDocumento.ToString();
            txtDescripcion.Text = gasto.Descripcion;
            txtMontoNeto.Text = gasto.MontoNeto.ToString();
            txtIVA.Text = gasto.Iva.ToString();
            txtRetencion.Text = gasto.Retencion.ToString();
            txtTotalPagado.Text = gasto.TotalPagado.ToString();
            txtMontoExento.Text = gasto.MontoExento.ToString();
            rbtTipoDocumento.SelectedValue = ((int)gasto.TipoDocumentoGenerico).ToString();

            if (!string.IsNullOrEmpty(gasto.ObservacionesSupervisor))
            {
                txtObsSupervisor.Text = gasto.ObservacionesSupervisor;
                txtObsSupervisor.Visible = true;
            }
            if (!string.IsNullOrEmpty(gasto.ObservacionesGerente))
            {
                txtObsGerente.Text = gasto.ObservacionesGerente;
                txtObsGerente.Visible = true;
            }
            mpeAgregarGasto.Show();
        }

        public Gasto GastoIngresado
        {
            get
            {
                return new Gasto()
                {
                    IdGasto = string.IsNullOrEmpty(hfIdGasto.Value) ? 0 : int.Parse(hfIdGasto.Value),
                    TipoGasto = new TipoGasto() { IdGasto = int.Parse(DrTipoGasto.SelectedValue), DescripcionGasto = DrTipoGasto.SelectedItem.Text },
                    GastoAsociado = int.Parse(DrGastoAsociado.SelectedValue),
                    RutBeneficiario = txtRutBeneficiario.Text,
                    NombreBeneficiario = txtNombreProveedor.Text,
                    FechaDocumento = string.IsNullOrEmpty(txtFechaDocumento.Text) ? DateTime.Now : Convert.ToDateTime(txtFechaDocumento.Text),
                    NroDocumento = string.IsNullOrEmpty(txtNroDocumento.Text) ? 0 : int.Parse(txtNroDocumento.Text),
                    Descripcion = string.IsNullOrEmpty(txtDescripcion.Text) ? "" : txtDescripcion.Text,
                    MontoNeto = string.IsNullOrEmpty(txtMontoNeto.Text) ? 0 : int.Parse(txtMontoNeto.Text),
                    MontoExento = string.IsNullOrEmpty(txtMontoExento.Text) ? 0 : int.Parse(txtMontoExento.Text),
                    Iva = string.IsNullOrEmpty(txtIVA.Text) ? 0 : int.Parse(txtIVA.Text),
                    Retencion = string.IsNullOrEmpty(txtRetencion.Text) ? 0 : int.Parse(txtRetencion.Text),
                    TotalPagado = string.IsNullOrEmpty(txtTotalPagado.Text) ? 0 : int.Parse(txtTotalPagado.Text),
                    TipoDocumento = new TipoDocumento() { IdDocumento = int.Parse(ddTipoDocumento.SelectedItem.Value), Descripcion = ddTipoDocumento.SelectedItem.Text },
                    TipoDocumentoGenerico = TipoDocumentoGenerico
                };
            }
        }

        protected void DrTipoGasto_SelectedIndexChanged(object sender, EventArgs e)
        {
            int idGasto = int.Parse(DrTipoGasto.SelectedValue);
            DrGastoAsociado.DataSource = _servGastos.TiposDeGastoAsociados(idGasto);
            DrGastoAsociado.DataBind();
            mpeAgregarGasto.Show();
        }

        public void Validar(Gasto gasto)
        {
            var mensajesDeValidacion = _validador.Valida(gasto, new Dictionary<string, object>()).ToList();
            if (!_validador.EsValido)
                throw new ResultadoValidacionException("Hay campos incompletos o que deben ser modificados", mensajesDeValidacion);
        }

        protected void BtnSeleccionarProveedorClick(object sender, EventArgs e)
        {
            lblProveedorNoExiste.Visible = false;
            var proveedor = Modulos.Rendiciones.Proveedores.Buscar(txtRutBeneficiario.Text.Trim(), 1);
            if (proveedor != null)
                txtNombreProveedor.Text = proveedor[0].Nombre;
            else
                lblProveedorNoExiste.Visible = true;
        }

        private void CalcularTotal()
        {
            var montoNeto = string.IsNullOrEmpty(txtMontoNeto.Text) ? 0 : int.Parse(txtMontoNeto.Text);
            var iva = string.IsNullOrEmpty(txtIVA.Text) ? 0 : int.Parse(txtIVA.Text);
            var retencion = string.IsNullOrEmpty(txtRetencion.Text) ? 0 : int.Parse(txtRetencion.Text);
            var montoExento = string.IsNullOrEmpty(txtMontoExento.Text) ? 0 : int.Parse(txtMontoExento.Text);
            var totalPagado = montoNeto + iva + montoExento - retencion;
            txtTotalPagado.Text = totalPagado.ToString();

        }

        protected void txtMontoNeto_TextChanged(object sender, EventArgs e)
        {
            CalcularTotal();
            txtIVA.Focus();
        }

        protected void txtIVA_TextChanged(object sender, EventArgs e)
        {
            CalcularTotal();
            txtMontoExento.Focus();
        }

        protected void txtMontoExento_TextChanged(object sender, EventArgs e)
        {
            CalcularTotal();
            txtRetencion.Focus();
        }

        protected void txtRetencion_TextChanged(object sender, EventArgs e)
        {
            CalcularTotal();
        }

    }
}